// import NativeHelper, { IProduct } from "../comm/NativeHelper";
// import USDate from "../comm/USDate";
// import { Toast } from "../components/Toast";
// import { CfgItemID } from "../configs/CfgItem";
// import Cfgs from "../configs/Cfgs";
// import { IReward } from "../configs/CfgSteakCollection";
// import { CfgStore, IStoreItem, IStoreItem4 } from "../configs/CfgStore";
// import { EnvType } from "../data/GameConfig";
// import { GameConfig } from "../data/GameConfig";
// import { PropID } from "../data/GameObjects";
// import { BoosterID } from "../data/GameObjects";
// import LocalValues, { LocalKey } from "../data/LocalValues";
// import UserCtrl from "../data/UserCtrl";
// import UserModel from "../data/UserModel";
// import { EventName } from "../manager/EventMgr";
// import { EventMgr } from "../manager/EventMgr";
// import { BalanceType, EventReport, reward2report2 } from "../net/EventReport";
// import HttpApi from "../net/HttpApi";
// import HallCtrl from "./HallCtrl";
// import { PassCtrl } from "./PassCtrl";


// export default class StoreCtrl {
//     private static _instance: StoreCtrl;
//     public static get instance(): StoreCtrl {
//         return this._instance || (this._instance = new StoreCtrl());
//     }
//     private _data: StoreData = null;
//     private _payCallbacks: ((code: string, data: {transactionId: string, token: string}, product: IProduct) => void)[] = [];

//     public init() {
//         // 初始化数据
//         this._data = LocalValues.getObject(LocalKey.storeData);
//         if (!this._data) {
//             this._data = {
//                 purchased: {},
//                 purchasedToday: [],
//                 noAdTime: 0,
//                 todayIdx: USDate.dayIdx(),
//                 item3datas: [],
//                 item3LastBuyCount: 0,
//                 item3LastCanBuyTime: 0,
//                 item4RefreshTime: 0,
//                 item4RefreshCount: 0,
//                 item4datas: [],
//             };
//             this.save();
//         }
//         // 启动下一天的倒计时：刷新item4RefreshCount
//         this.countdownTomorrow();
//         if (this._data.todayIdx != USDate.dayIdx()) {
//             this.onTomorrow();
//         }
//         this.countdown4();
//         EventMgr.on(EventName.onPaySuccess, this.onPaySuccess, this);
//         EventMgr.on(EventName.onPayFail, this.onPayFail, this);
//     }

//     private async onPaySuccess(data: {transactionId: string, token: string}, product: IProduct) {
//         console.log('###StoreCtrl.onPaySuccess', data, product);
//         if (!product) {
//             const payItem:IStoreItem = LocalValues.getObject(LocalKey.payItem);
//             product = {
//                 productId: payItem.productId,
//                 price: payItem.dollarPrice,
//                 name: payItem.id == 1 ? 'removeads' : payItem.id == 2 ? 'pack' : 'coin',
//             }
//         }
//         // 网络请求验单，成功后调用callback
//         let pid = UserModel.uid + '_' + Date.now();
//         let payParams = NativeHelper.isNative ? JSON.stringify({
//             productId: product.productId,
//             token: data.token,
//         }) : '';
//         let res = await HttpApi.payNotify({
//             pid,
//             orderId: data.transactionId,
//             price: product.price,
//             payChannel: 0,
//             payParams,
//             reportParams: '',
//         });
//         console.log('###StoreCtrl.onPaySuccess res');
//         console.log(JSON.stringify(res));
//         NativeHelper.callPayConsume(data.token); // 消耗订单
//         if (res.code == 0) {
//             for (const callback of this._payCallbacks) {
//                 callback("0", data, product);
//             }
//             if (res.data.isRepeat && NativeHelper.isNative) {
//                 // 重复提交
//                 return;
//             }
//             const payItem:IStoreItem = LocalValues.getObject(LocalKey.payItem);
//             if (payItem?.productId != product.productId) {
//                 // 非商店内购
//                 // 处理PASS内购
//                 if (product.productId == Cfgs.BattlePass.productId) {
//                     PassCtrl.instance.buyPass();
//                 }
//                 return;
//             }
//             //======以下是处理商店内购发放========
//             if (this._payCallbacks.length == 0) {
//                 // 这种情况可能是补单
//                 this._data.purchased[payItem.id] = (this._data.purchased[payItem.id] || 0) + 1;
//                 this._data.purchasedToday[payItem.id] = (this._data.purchasedToday[payItem.id] || 0) + 1;
//                 this.save();
//             }
//             // 上报
//             const isfirstpay = LocalValues.addCount('isfirstpay') == 1;
//             this.issueRewards(payItem.Reward);
//             setTimeout(() => {
//                 try {
//                     let isTest = GameConfig.envType == EnvType.Test || data.transactionId?.startsWith('GPA.');
//                     EventReport.recharge({
//                         balance: [
//                             {type: BalanceType.coins, count: UserModel.coin},
//                             {type: BalanceType.booster_perfume, count: UserModel.getBoosterCount(BoosterID.perfume)},
//                             {type: BalanceType.booster_joker, count: UserModel.getBoosterCount(BoosterID.joker)},
//                             {type: BalanceType.booster_slot, count: UserModel.getBoosterCount(BoosterID.slot)},
//                             {type: BalanceType.prop_add, count: UserModel.getPropCount(PropID.PropAdd)},
//                             {type: BalanceType.prop_joker, count: UserModel.getPropCount(PropID.PropJoker)},
//                             {type: BalanceType.prop_undo, count: UserModel.getPropCount(PropID.PropUndo)},
//                         ],
//                         buyContent: reward2report2(...payItem.Reward),
//                         count: 1,
//                         currency: 'USD',
//                         isFirstpay: isfirstpay,
//                         isRepair: res.code == 1,
//                         itemId: payItem.id,
//                         itemPos: 'store',
//                         itemType: payItem.id == 1 ? 'removeads' : payItem.id == 2 ? 'pack' : 'coin',
//                         level: UserModel.curLevelId,
//                         orderId: res.data?.pid || pid,
//                         price: payItem.dollarPrice,
//                         time: Date.now(),
//                         transactionId: data.transactionId,
//                         isTest,
//                     });
//                 } catch (error) {
//                     console.log('###StoreCtrl.onPaySuccess EventReport.recharge error');
//                     console.error(error);
//                 }
//             }, 10);
//         } else {
//             this.onPayFail("s" + res.code, product);
//         }
//     }
//     private onPayFail(code: string, product: IProduct) {
//         console.log('###StoreCtrl.onPayFail', code, product);
//         for (const callback of this._payCallbacks) {
//             callback(code, null, product);
//         }
//         if (code == '1') {
//             Toast.show('User cancelled', 1.5);
//         } else {
//             Toast.show('Payment failed: ' + code, 1.5);
//         }
//         const payItem:IStoreItem = LocalValues.getObject(LocalKey.payItem);
//         if (payItem?.productId != product.productId) {
//             return;
//         }
//         if (code == '1') {
//             EventReport.purchase_cancel({
//                 itempos: 'store',
//                 itemtype: product.name,
//                 level: UserModel.curLevelId,
//                 price: payItem.dollarPrice,
//             });
//             EventReport.purchase_failed({
//                 currency: 'USD',
//                 itempos: 'store',
//                 itemtype: product.name,
//                 level: UserModel.curLevelId,
//                 price: payItem.dollarPrice,
//                 purchasefailedreason: '4',
//             })
//         } else {
//             EventReport.purchase_failed({
//                 currency: 'USD',
//                 itempos: 'store',
//                 itemtype: product.name,
//                 level: UserModel.curLevelId,
//                 price: payItem.dollarPrice,
//                 purchasefailedreason: code,
//             })
//         }
//     }
//     public addPayCallback(callback: (code: string, data: {transactionId: string, token: string}, product: IProduct) => void) {
//         this._payCallbacks.push(callback);
//     }
//     public removePayCallback(callback: (code: string, data: {transactionId: string, token: string}, product: IProduct) => void) {
//         this._payCallbacks = this._payCallbacks.filter(item => item != callback);
//     }
//     private countdownTomorrow() {
//         setTimeout(() => {
//             // onTomorrow
//             this.onTomorrow();
//             this.countdownTomorrow();
//             EventMgr.emit(EventName.onTomorrow);
//         }, USDate.getTomorrowCountdown());
//     }
//     private onTomorrow() {
//         console.log('###StoreCtrl.onTomorrow');
//         // 清空所有today相关的数据
//         this._data.todayIdx = USDate.dayIdx();
//         this._data.purchasedToday = {};
//         this._data.item4RefreshCount = 0;
//         for (let i = 0; i < this._data.item3datas.length; i++) {
//             this._data.item3datas[i].buyCount = 0;
//             this.refresh3(i);
//         }
//         this.save();
//     }

//     public get cfg(): CfgStore {
//         return Cfgs.Store;
//     }

//     public getDatas4(): IStoreItem4[] {
//         return this.cfg.getDatas4();
//     }

//     public getDatas(type: number): IStoreItem[] {
//         return this.cfg.getDatasByType(type);
//     }

//     public getUnlockBlocks() {
//         let unlocks: boolean[] = [];
//         for (let i = 0; i < 5; i++) {
//             let level = this.cfg.getUnlockLevel(i + 1);
//             unlocks.push(UserModel.curLevelId >= level);
//         }
//         return unlocks;
//     }

//     public isShowBlock2() {
//         const datas = this.cfg.getDatasByType(2);
//         for (let i = 0; i < datas.length; i++) {
//             const item = datas[i];
//             if (this.getBuyCount(item.id) < item.limit) {
//                 return true;
//             }
//         }
//         return false;
//     }

//     public async buy(id: number) {
//         const item = this.cfg.getItemById(id);
//         if (item.type == 3 || item.type == 4) {
//             throw new Error('商品3或商品4 调用buy3或buy4');
//         }
//         // 判断是否可以购买
//         if (item.type == 2) { // 破冰礼包
//             if (this.getBuyCount(id) >= item.limit) {
//                 return null;
//             }
//         }
//         if (!item.productId) {
//             throw new Error('商品没有productId');
//         }
//         try {
//             EventReport.purchase_click({
//                 currency: 'USD',
//                 itempos: 'store',
//                 itemtype: item.id == 1 ? 'removeads' : item.id == 2 ? 'pack' : 'coin',
//                 level: UserModel.curLevelId,
//                 price: item.dollarPrice,
//             })
//         } catch (e) {}
//         // type 1,2,5 是USD商品，不用扣金币
//         let bSuccess = await this.inPurchase(item);
//         if (!bSuccess) {
//             return null;
//         }
//         this._data.purchased[id] = (this._data.purchased[id] || 0) + 1;
//         this._data.purchasedToday[id] = (this._data.purchasedToday[id] || 0) + 1;
//         this.save();
//         // this.issueRewards(item.Reward);
//         return item.Reward;
//     }
//     // 判断是否有库存，目前仅针对type2
//     public isInLimit(id: number): boolean {
//         const item = this.cfg.getItemById(id);
//         console.log('isInLimit', id, this.getBuyCount(id), item.limit);
//         return this.getBuyCount(id) < item.limit;
//     }
//     // 发放奖励
//     private issueRewards(rewards: IReward[], reason = '') {
//         console.log('###StoreCtrl issueRewards###', rewards);
//         HallCtrl.addRewardToQueue(rewards, reason || 1, true);
//         EventMgr.emit(EventName.refreshDisplayCoin);
//         for (const e of rewards) {
//             let reason = 0;
//             // undo,add,joker,perfume,slot,booster_joker,booster_slot,booster_perfume
//             if (e.itemId == CfgItemID.prop_undo) {
//                 reason = 1;
//             } else if (e.itemId == CfgItemID.prop_add) {
//                 reason = 2;
//             } else if (e.itemId == CfgItemID.prop_joker) {
//                 reason = 3;
//             } else if (e.itemId == CfgItemID.booster_perfume) {
//                 reason = 4;
//             } else if (e.itemId == CfgItemID.booster_slot) {
//                 reason = 5;
//             } else if (e.itemId == CfgItemID.booster_joker) {
//                 if (e.time) {
//                     reason = 7;
//                 } else {
//                     reason = 6;
//                 }
//             }
//             // UserCtrl.reportConsume(e.itemId, e.count || 1, reason as any);
//         }
//     }
//     //========= <商品3 =========
//     public getItem3Datas(): StoreItem3Data[] {
//         if (!this._data.item3datas.length) {
//             for (let i = 0; i < this.cfg.getDatas3().length; i++) {
//                 this.refresh3(i);
//             }
//         }
//         return this._data.item3datas;
//     }
//     public refresh3(idx: number) {
//         const item3 = this.cfg.getDatas3()[idx];
//         const old = this._data.item3datas[idx];
//         // reward是从item3.Reward中随机一个
//         let rewards = [...item3.Reward];
//         if (rewards.length > 1 && old) {
//             rewards = rewards.filter(item => item != old.reward);
//         }
//         let reward = rewards[Math.floor(Math.random() * rewards.length)];
//         this._data.item3datas[idx] = {
//             reward,
//             bAd: idx != 0,
//             canBuyTime: old?.canBuyTime || 0,
//             buyCount: old?.buyCount || 0,
//         }
//         this.save();
//     }
//     public buy3(id: number) {
//         const item3s = this.cfg.getDatas3();
//         const idx = item3s.findIndex(item => item.id == id);
//         const item3 = item3s[idx];
//         const canBuyTime = this._data.item3datas[idx].canBuyTime;
//         if (Date.now() < canBuyTime) {
//             return null;
//         }
//         // USD商品，不用扣金币
//         const data = this._data.item3datas[idx];
//         data.buyCount ++;
//         const buyCount = data.buyCount || 0;
//         const refreshTime = item3.refreshTime[Math.min(buyCount, item3.refreshTime.length - 1)] * 1000;
//         data.canBuyTime = Date.now() + refreshTime;
//         console.log('###StoreCtrl.buy3 canBuyTime', data.canBuyTime,'refreshTime', refreshTime);
//         this.refresh3(idx);
//         if (data.reward.itemId == CfgItemID.coin) {
//             this.issueRewards([data.reward], 'shop_free_coin');
//         } else {
//             this.issueRewards([data.reward]);
//         }
//         this.save();
//         return data.reward;
//     }
//     public getItem3LastBuyCount(): number {
//         return this._data.item3LastBuyCount;
//     }
//     public getItem3LastCanBuyTime(): number {
//         return this._data.item3LastCanBuyTime;
//     }
//     public buy3Last() {
//         const item3Last = this.cfg.getData3Last();
//         if (this._data.item3LastBuyCount >= item3Last.Reward.length) {
//             return null;
//         }
//         // USD商品，不用扣金币
//         const idx = this._data.item3LastBuyCount;
//         this._data.item3LastBuyCount++;
//         if (this._data.item3LastBuyCount >= item3Last.Reward.length) {
//             const refreshTime = item3Last.refreshTime[0] * 1000;
//             this._data.item3LastCanBuyTime = Date.now() + refreshTime;
//         }
//         this.save();
//         const reward = item3Last.Reward[idx];
//         this.issueRewards([reward]);
//         return reward;
//     }
//     //========= 商品3> =========

//     //========= <商品4 =========
//     public getItem4Datas(): StoreItem4Data[] {
//         if (!this._data.item4datas.length) {
//             this.refresh4();
//         }
//         return this._data.item4datas;
//     }
//     public getItem4RefreshTime(): number {
//         return this._data.item4RefreshTime;
//     }
//     // 重新生成3个商品4
//     public refresh4(bCoin = false) {
//         if (bCoin) {
//             const refreshCoin = this.getRefreshCoin4();
//             if (!UserCtrl.costCoin(refreshCoin)) {
//                 Toast.show('You don\'t have enough coins', 1.3);
//                 return false;
//             }
//             this._data.item4RefreshCount++;
//             this.reportConsume(CfgItemID.coin, refreshCoin, 'shop_refresh');
//         }
//         const item4s = this.cfg.getDatas4();
//         for (let i = 0; i < 3; i++) {
//             const item4 = item4s[Math.floor(Math.random() * item4s.length)];
//             let count = 0;
//             let time = 0;
//             let coinOri = 0;
//             let coin = 0;
//             let price = item4.itemPrice; // 单价
//             if (item4.itemRandomQuantity?.length) {
//                 const len = item4.itemRandomQuantity.length;
//                 const idx = Math.floor(Math.random() * len);
//                 count = item4.itemRandomQuantity[idx];
//                 coinOri = price * (idx + 1);
//             } else {
//                 const len = item4.itemRandomTime.length;
//                 const idx = Math.floor(Math.random() * len);
//                 time = item4.itemRandomTime[idx] * 1000;
//                 coinOri = price * (idx + 1);
//             }
//             // 打折
//             const discounts = item4.itemRandomDiscount || [0];
//             const discount = discounts[Math.floor(Math.random() * discounts.length)] || 0;
//             coin = Math.ceil(coinOri * (1 - discount / 100));
//             console.log('###StoreCtrl.refresh4 discount', discount, coinOri, coin);
//             let reward: IReward = {
//                 itemId: item4.itemId,
//                 count: count,
//                 time: time,
//             }
//             this._data.item4datas[i] = {
//                 reward,
//                 discount,
//                 coinOri,
//                 coin,
//                 soldOut: false,
//             }
//         }
//         this._data.item4RefreshTime = Date.now() + this.cfg.getData4RefreshTime();
//         this.save();
//         this.countdown4();
//         return true;
//     }
//     private countdown4() {
//         const time = Math.max(this._data.item4RefreshTime - Date.now(), 0);
//         setTimeout(() => {
//             this.refresh4();
//         }, time);
//     }
//     public buy4(item4Idx: number) {
//         const item4datas = this._data.item4datas;
//         const item4data = item4datas[item4Idx];
//         if (item4data.soldOut) {
//             return null;
//         }
//         // 金币商品，扣金币
//         if (!UserCtrl.costCoin(item4data.coin)) {
//             Toast.show('You don\'t have enough coins', 1.3);
//             return null;
//         }
//         item4data.soldOut = true;
//         this.save();
//         this.issueRewards([item4data.reward]);
//         this.reportConsume(CfgItemID.coin, item4data.coin, item4data.reward);
//         return item4data.reward;
//     }
//     private reportConsume(itemId: CfgItemID, count: number, reward: IReward | String) {
//         let reason: any = 0;
//         if (typeof reward == 'string') {
//             reason = reward;
//         } else {
//             const r = reward as IReward;
//             if (r.itemId == CfgItemID.coin) {
//                 reason = 0;
//             } else if (r.itemId == CfgItemID.prop_undo) {
//                 reason = 1;
//             } else if (r.itemId == CfgItemID.prop_add) {
//                 reason = 2;
//             } else if (r.itemId == CfgItemID.prop_joker) {
//                 reason = 3;
//             } else if (r.itemId == CfgItemID.booster_perfume) {
//                 reason = 4;
//             } else if (r.itemId == CfgItemID.booster_slot) {
//                 reason = 5;
//             } else if (r.itemId == CfgItemID.booster_joker) {
//                 reason = 6;
//             }
//         }
//         console.log('###StoreCtrl.reportConsume', itemId, count, reward, reason);
//         UserCtrl.reportConsume(itemId, count, reason as any);
//     }
//     public getRefreshCoin4() {
//         let coins = this.cfg.getDatas4()[0].itemRefreshPrice;
//         let count = this._data.item4RefreshCount;
//         return coins[Math.min(count, coins.length - 1)];
//     }
//     //========= 商品4> =========

//     public getBuyCount(id: number): number {
//         return this._data.purchased[id] || 0;
//     }
//     private getBuyCountToday(id: number): number {
//         return this._data.purchasedToday[id] || 0;
//     }

//     private _timerSave = null;
//     private save() {
//         if (this._timerSave) {
//             return;
//         }
//         this._timerSave = setTimeout(() => {
//             this._timerSave = null;
//             LocalValues.setObject(LocalKey.storeData, this._data);
//         }, 100);
//     }

//     public inPurchase(item: IStoreItem) {
//         HallCtrl.blockTouch(1);
//         return new Promise<boolean>(resolve => {
//             LocalValues.setObject(LocalKey.payItem, item);
//             const name = item.id == 1 ? 'removeads' : item.id == 2 ? 'pack' : 'coin';
//             NativeHelper.callPayBuy({productId: item.productId, price: item.dollarPrice, name});
//             const callback = (code: string, data: {transactionId: string, token: string}) => {
//                 resolve(code == '0');
//                 this.removePayCallback(callback);
//             }
//             this.addPayCallback(callback);
//         });
//     }

//     public inPurchaseAny(product: IProduct) {
//         console.log('###StoreCtrl.inPurchaseAny', product);
//         HallCtrl.blockTouch(1);
//         return new Promise<boolean>(resolve => {
//             NativeHelper.callPayBuy(product);
//             const callback = (code: string, data: {transactionId: string, token: string}) => {
//                 resolve(code == '0');
//                 this.removePayCallback(callback);
//             }
//             this.addPayCallback(callback);
//         });
//     }
// }

// export interface StoreData {
//     // 累计已购买商品 {id: 数量}
//     purchased: { [key: number]: number };
//     // 今日已购买商品 {id: 数量}
//     purchasedToday: { [key: number]: number };
//     // 免广告到期时间
//     noAdTime: number;
//     // 今天是第几天
//     todayIdx: number;
//     // 商品3列表
//     item3datas: StoreItem3Data[];
//     item3LastBuyCount: number;
//     item3LastCanBuyTime: number;
//     // 商品4刷新时间
//     item4RefreshTime: number;
//     // 商品4今天刷新次数
//     item4RefreshCount: number;
//     // 商品4列表
//     item4datas: StoreItem4Data[];
// }
// export interface StoreItem3Data {
//     reward: IReward;
//     bAd: boolean; // 是否需要看广告
//     canBuyTime: number; // 下次可领取的时间
//         // 每次领取时，canBuyTime会变
//         // 启动时|领取后，需要启动一个canBuyTime倒计时
//     buyCount: number; // 已购买次数
// }
// export interface StoreItem4Data {
//     reward: IReward;
//     discount: number;
//     coinOri: number;
//     coin: number;
//     soldOut: boolean;
// }